package appapi.utils;



import cn.hutool.core.codec.Base64;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class AESUtil {
        private static String KEY = "V2FuZzkyNjQ1NGRTQkFQSKJGTR==asdf";   //密码
        private static String IV = "AzGDd25fFzD8O6Py";     //偏移量

        /**
         * 加密方法
         *
         * @param data 要加密的数据
         * @param key  加密key
         * @param iv   偏移量iv
         * @return 加密的结果
         * @throws Exception
         */
        public static String encrypt(String data, String key, String iv) {
            try {
                //"算法/模式/补码方式"NoPadding PkcsPadding
                Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
                int blockSize = cipher.getBlockSize();

                byte[] dataBytes = data.getBytes();
                int plaintextLength = dataBytes.length;
                if (plaintextLength % blockSize != 0) {
                    plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
                }

                byte[] plaintext = new byte[plaintextLength];
                System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);

                SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
                IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());

                cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
                byte[] encrypted = cipher.doFinal(plaintext);
                return Base64.encode(encrypted);
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }

        /**
         * 解密方法
         *
         * @param data 要解密的数据
         * @param key  解密key
         * @param iv   偏移量iv
         * @return 解密的结果
         * @throws Exception
         */
        public static String decrypt(String data, String key, String iv) {
            try {
                byte[] encrypted1 = Base64.decode(data);
                Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
                SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
                IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
                cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);
                byte[] original = cipher.doFinal(encrypted1);
                String originalString = new String(original);
                return originalString;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }

        /**
         * 使用默认的key和iv加密
         *
         * @param data
         * @return
         * @throws Exception
         */
        public static String enCrypt(String data) {
            return encrypt(data, KEY, IV);
        }

        /**
         * 使用默认的key和iv解密
         *
         * @param data
         * @return
         * @throws Exception
         */
        public static String deEncrypt(String data) {
            return decrypt(data, KEY, IV).trim();
        }


//    /**
//     * 测试
//     */
//    public static void main(String args[]) throws Exception {
//        String test1 = "liwei123456";
//
//         String  data = enCrypt(test1);
//
//        System.out.println("加密："+data);
//
//        String jiemi =deEncrypt(data);
//        System.out.println("解密："+jiemi);
//        System.out.println(1);
//
//    }
    }